package com.confiteriafuentes.modelo.solicitud;

// @ Copyright 
// Ingeniero Juan Jos Puello Fuentes.
import java.io.*;
import java.util.*;
import java.text.*;

public class Fecha {
		private	int dd;
		private	int mm;
		private	int aa;
		private int hora;
		private int minuto;
		private int segundo;
		private Date dateFecha;
		public Fecha(){
			dd=0;
			mm=0;
			aa=0;
			dateFecha = null;
		}
		public Fecha(int dd,int mm,int aa,int hora, int minuto,int segundo){
			if(fechaValida(pegarFecha(dd,mm,aa)) && horaValida(hora,minuto,segundo)){
			   this.dd=dd;
			   this.mm=mm;
			   this.aa=aa;
			   this.hora=hora;
			   this.minuto=minuto;
			   this.segundo=segundo;
			}else{
   			   dd=0;
			   mm=0;
			   aa=0;
			   hora=0;
			   minuto=0;
			   segundo=0;
   			   System.out.println("Error en fecha..!");
   			}
   			dateFecha = formatoDMA_HMS(dd,mm,aa,hora,minuto,segundo);     
		}
		public Fecha(int dd,int mm,int aa){
			if(fechaValida(pegarFecha(dd,mm,aa))){
			   this.dd=dd;
			   this.mm=mm;
			   this.aa=aa;
			}else{
   			   dd=0;
			   mm=0;
			   aa=0;
   			   System.out.println("Error en fecha..!");
   			}  
   			dateFecha = formatoDMA(dd,mm,aa);   
		}
		public Fecha(String f){
   			if(fechaValida(f)){
   			   dd = Integer.parseInt(f.substring(0,2));
			   mm = Integer.parseInt(f.substring(3,5));
			   aa = Integer.parseInt(f.substring(6,10));
   			}else{
   			   dd=0;
			   mm=0;
			   aa=0;
   			   System.out.println("Error en fecha..!");
   			} 
   			dateFecha = formatoDMA(dd,mm,aa);  
		}
		public Fecha(Date f){
			dateFecha = f;
			//Seleccionando un formato para el manejo de la fecha
			SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
			String fecha = formato.format(f); //Convirtiendo a cadena
			dd=Integer.parseInt(fecha.substring(0,2));  //Extrayendo el dia
			mm=Integer.parseInt(fecha.substring(3,5));  //Extrayendo el mes
			aa=Integer.parseInt(fecha.substring(6,10)); //Extrayendo el ao
			hora=Integer.parseInt(fecha.substring(11,13)); //Extrayendo  hora
			minuto=Integer.parseInt(fecha.substring(14,16)); //Extrayendo minuto
			segundo=Integer.parseInt(fecha.substring(17,19)); //Extrayendo segundo
		}
		public int getDD(){return dd;}
		public int getMM(){return mm;}
		public int getAA(){return aa;}
		public int getHora(){return hora;}
		public int getMinuto(){return minuto;}
		public int getSegundo(){return segundo;}
		public String getReloj(){
			String r="PM";
			GregorianCalendar gc = new GregorianCalendar();
		    gc.setTime(dateFecha);                        
        	if(gc.get(Calendar.AM_PM) == 0)
               r = "AM";
			return pegarHora(hora,minuto,segundo) +" "+r;
		}
		public int periodo(){
        	if(getMM() < 7)
        	   return 1;
        	else
        	   return 2;   
        }
		public String getFecha(){return pegarFecha(dd,mm,aa);}
		public Date getDateFecha(){return dateFecha;}
		public String getFechaHora(){return pegarFecha(dd,mm,aa)+" "+pegarHora(hora,minuto,segundo);}
        
        //Devuelve un numero correspondiente al dia de la semana 1-Domingo..7-Sbado
        public int getDiaSemana(){  
            GregorianCalendar gc = new GregorianCalendar();
		    gc.setTime(dateFecha);                        
        	return gc.get(Calendar.DAY_OF_WEEK);
        }
        //Permite iniciar o modificar la hora 
        public void setHora(String hora){
       	    int h=0,m=0,s=0;
        	boolean err=false;
        	try{
        	    h=Integer.parseInt(hora.substring(0,2)); //Extrayendo la hora
			    m=Integer.parseInt(hora.substring(3,5)); //Extrayendo minutos
			    s=Integer.parseInt(hora.substring(6,8)); //Extrayendo segundos
        	    if(horaValida(h,m,s)){
        	       this.hora=h;
			       minuto=m;
			       segundo=s;
			    }else
			       err = true;
			}catch(Exception e){
				err=true;
			}           
			if(err)
			   System.out.println("Error en la hora..!");
        } 

        //Suma dias a la fecha 
        public void sumaDias(int d){
        	boolean seguir = true;
        	dd+=d;
			while(seguir){
				seguir = false;
				switch(mm){
					 case 4 :
					 case 6 :
					 case 9 :
					 case 11: if(dd>30){ 
					             mm++;
					             dd-=30;
					             seguir = true;
					          }    
					          break;
					 case 2 : if(aa%4 == 0){
							     if(dd>29){ 
							        mm++;
							        dd-=29;
							        seguir = true;
							     }   
							  }else{
								 if(dd>28){
								  	mm++;
								 	dd-=28;
								 	seguir = true;
								 }
							  }	 
					          break;
					default : if(dd>31){ 
								 mm++;
								 dd-=31;
								 seguir = true;
							  }	
				}
				if(mm>12){
					aa++;
					mm-=12;
					seguir = true;
				}
			}
			dateFecha = formatoDMA_HMS(dd,mm,aa,hora,minuto,segundo);
        }
        //Suma meses a la fecha en proceso
        public void sumaMeses(int m){
        	int j=0;
        	aa+=m/12;
        	mm+=(m%12)-1;
        	m=m%12;
        	if(dd==31){
	        	if((m==1) || (m==3) || (m==5) || (m==8) || (m==10) || (m==12))
	        	   j=1;	
	        	switch(mm+j){
					 case 4 :
					 case 6 :
					 case 9 :
					 case 11: sumaDias(30);
					          break;
					 case 2 : if(aa%4 == 0)
				                sumaDias(29);
							  else
				                sumaDias(28);
					          break;
					default : sumaDias(31);	
				}
			}else{
			    mm++;
			    if(aa%4 == 0){
				  if(mm==2 && dd>29)
				     dd=29;
				}else
				  if(mm==2 && dd>28)
				     dd=28;             
			    
			}    
        }
        //Suma aos a la fecha 
        public void sumaAos(int a){
        	aa+=a;
        	dateFecha = formatoDMA_HMS(dd,mm,aa,hora,minuto,segundo);
        }

        // Toma los componentes enteros por separado y los une en un formato 
        // de cadena (dd/mm/aaaa)
        private String pegarFecha(int d,int m,int a){
        	String f= new String();
        	if(d/10 == 0)
        	   f='0'+String.valueOf(d);
        	else 
        	   f=String.valueOf(d); 
        	f+='/';
        	if(m/10 == 0)
        	   f+='0'+String.valueOf(m);
        	else 
        	   f+=String.valueOf(m);
        	f+='/';
        	if(a/10 == 0)
        	   f+='0'+String.valueOf(a);
        	else 
        	   f+=String.valueOf(a);   
        	return f;
        }
        private String pegarHora(int h,int m,int s){
        	String r="";
        	if(h/10 == 0)
        	   r='0'+String.valueOf(h);
        	else 
        	   r=String.valueOf(h); 
        	r+=':';
        	if(m/10 == 0)
        	   r+='0'+String.valueOf(m);
        	else 
        	   r+=String.valueOf(m);
        	r+=':';
        	if(s/10 == 0)
        	   r+='0'+String.valueOf(s);
        	else 
        	   r+=String.valueOf(s);   
        	return r;
        }
		private Date formatoDMA_HMS(int dia,int mes,int ao,int hora,int minuto,int segundo){
			Date f = null;
			SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yy hh:mm:ss");
			try{
			     f = formato.parse(dia+"-"+mes+"-"+ao+" "+hora+":"+minuto+":"+segundo);
			}catch(Exception e){}
			return f;
		} 
		private Date formatoDMA(int dia, int mes, int ao){
			Date f = null;
			SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yy");
			try{
			     f = formato.parse(dia+"-"+mes+"-"+ao);
			}catch(Exception e){}
			return f;
		} 
		//Verifica la validez de una hora en formato cadena (hh:mm:ss)
		public boolean horaValida(int h, int m, int s){
			boolean err = false;
			if(h<0 || h>23)
			   err = true;
			if(m<0 || m>59)
			   err = true;
			if(s<0 || s>59)
			   err = true;
			return !err;         
		}
		//Verifica la validez de una fecha en formato cadena (dd/mm/aaaa)
		public static boolean fechaValida(String f){ 
            int d=0,m=0,a=0;
            boolean err=false;
			try{
			    d = Integer.parseInt(f.substring(0,2));
			    m = Integer.parseInt(f.substring(3,5));
			    a = Integer.parseInt(f.substring(6,10));
			}catch(Exception e){
				err=true;
			}    
			if((d>0) && (d<=31)){
				if((m>0)&&(m<=12))
					switch(m){
						case 4 :
						case 6 :
						case 9 :
						case 11:
							 if(d >30)
								err=true;
							 break;
						case 2 :
							 if(d <= 29){
								if((d == 29) && (a%4 != 0))
									 err=true;
							 }else
								err=true;
					}
				else
					err=true;
			}else
				 err=true;
			return !err;
		}   
		//Calcula la diferencia de tiempo entre dos fechas en dias meses y aos
		                        // Mayor -- Menor
		public static Fecha tiempo(Fecha f1,Fecha f2){
			f1= new Fecha(f1.dd,f1.mm,f1.aa);
			Fecha f3 = new Fecha();
			if(f1.dd < f2.dd){
				switch(f1.mm){
					 case 4 :
					 case 6 :
					 case 9 :
					 case 11: f1.dd+=30; break;
					 case 2 : if(f1.aa%4 == 0)
							     f1.dd+=29;
							  else
								 f1.dd+=28;
					          break;
					default : f1.dd+=31;
				}
				f1.mm--;
			}
			if(f1.mm < f2.mm){
				f1.mm+=12;
				f1.aa--;
			}
			f3.dd = f1.dd - f2.dd;
			f3.mm = f1.mm - f2.mm;
			f3.aa = f1.aa - f2.aa;
			return f3;
        }
        //Compara dos fechas y devueve verdadero si la primera es mayor que la segunda
        //  f1.mayor(f2)
        public boolean mayor(Fecha f){
        	boolean may = false;
        	if(aa > f.aa)
        	   may = true;
        	else
        	   if(aa == f.aa)    
        	      if(mm > f.mm)
        	         may = true;
        	      else
        	         if(mm == f.mm)
        	            if(dd > f.dd)
        	               may = true;
        	return may;                 
        }
        //Muestra la fecha con la hora formato largo en espaol
        public String toString(){
        	String f="";
        	int d = getDiaSemana();
        	switch(d){
        		case 1: f+="Domingo";   break;
        		case 2: f+="Lunes";     break;
        		case 3: f+="Martes";    break;
        		case 4: f+="Miercoles"; break; 
        		case 5: f+="Jueves";    break;
        		case 6: f+="Viernes";   break;
        		case 7: f+="Sabado";    break;
        	}
        	f+=" "+dd+" de ";
        	switch(mm){
        		case 1 : f+="Enero";      break;
        		case 2 : f+="Febrero";    break;
        		case 3 : f+="Marzo";      break;
        		case 4 : f+="Abril";      break; 
        		case 5 : f+="Mayo";       break;
        		case 6 : f+="Junio";      break;
        		case 7 : f+="Julio";      break;
        		case 8 : f+="Agosto";     break;
        		case 9 : f+="Septiembre"; break;
        		case 10: f+="Octubre";    break;
        		case 11: f+="Noviembre";  break; 
        		case 12: f+="Diciembre";  break;
        	}
        	f+=" de "+aa+"  "+getReloj(); 
        	return f; 
        }
}        
